package com.obelisco.vista.componentes;

import java.util.Vector;

import nextapp.echo2.app.Component;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Font;
import nextapp.echo2.app.ImageReference;
import nextapp.echo2.app.Insets;
import nextapp.echo2.app.Window;
import nextapp.echo2.app.event.WindowPaneEvent;
import nextapp.echo2.app.event.WindowPaneListener;

import com.obelisco.vista.estilos.Styles;
import com.obelisco.vista.inicio.Aplicacion;

import consultas.echo2consultas.SpWindowPane;
import echopointng.ContentPaneEx;
import echopointng.ExtentEx;
import echopointng.layout.DisplayLayoutData;

public class Ventana extends ContentPaneEx implements IVentana {

	private String titulo = "Sin Titulo";
	private Component padre;
	private boolean cerrarVentana = true;
	private int ancho = 0;
	private int alto = 0;
	private boolean incrustado = false;
	private boolean modal = false;
	private boolean minimizable = true;
	private boolean maximizable = true;
	private boolean cerrable = true;
	
	private ImageReference icono =  Styles.ICON_24_INFORMACION;

	private VentanaDialogo dialogo;
	public Vector<VentanaListener> listeners = new Vector<VentanaListener>();

	public Ventana(String titulo) {
		super();
		if (titulo != null)
		{
			titulo = titulo.toUpperCase();
		}
		this.titulo = titulo;
	}
	
	public Ventana() {
		super();
	}

	private WindowPaneListener eventoCierreVentana = new WindowPaneListener() {

		public void windowPaneClosing(WindowPaneEvent event) {

			distribuirEventoSalir();
			
			if (cerrarVentana) 
			{
				if (padre != null && dialogo != null) {
					padre.remove(dialogo);
					dialogo = null;
				}
			}
			
		}

	};

	public void mostrar(Component padre) {
		this.padre = padre;		
		this.padre.add(this);
		distribuirEventoMostrar();
	}

	public void mostrarDialogo(Component padre) {
		// TODO Auto-generated method stub
		this.padre = padre;
		dialogo = new VentanaDialogo(this, ancho, alto);
		dialogo.setModal(this.modal);
		dialogo.setMinimizable(this.minimizable);
		dialogo.setMaximizable(this.maximizable);
		dialogo.setClosable(this.cerrable);
		dialogo.addWindowPaneListener(eventoCierreVentana);
		this.padre.add(dialogo);
		distribuirEventoMostrar();
	}
	
	protected void distribuirEventoSalir() {

		for (VentanaListener listener : listeners) {
			listener.onSalir(this, cerrarVentana);
		}
		
	}
	

	public boolean salir() {

		distribuirEventoSalir();
		
		if (cerrarVentana) 
		{
			if (dialogo != null) {
				padre.remove(dialogo);
				dialogo = null;
			} else {
				padre.remove(this);
			}
		}

		return cerrarVentana;
	}

	public String getTitulo() {
		// TODO Auto-generated method stub
		return titulo;
	}

	public void setTitulo(String titulo) {
		// TODO Auto-generated method stub
		this.titulo = titulo;
	}
	
	public void addVentanaListener(VentanaListener listener) {		
		listeners.add(listener);
	}

	public void removeVentanaListener(VentanaListener listener) {
		listeners.remove(listener);
	}

	protected void distribuirEventoMostrar() {
		for (VentanaListener listener : listeners) {
			listener.onMostrar(this);
		}
	}

	public void mostrarDialogo(int ancho, int alto) {
		// TODO Auto-generated method stub		
		Aplicacion aplicacion = Aplicacion.getApp();
		Window window = aplicacion.getDefaultWindow();		
		this.padre = window.getContent();//Aplicacion.getApp().getDefaultWindow().getContent();
		dialogo = new VentanaDialogo(this, ancho, alto);
		dialogo.setModal(this.modal);
		dialogo.setMinimizable(this.minimizable);
		dialogo.setMaximizable(this.maximizable);
		dialogo.setClosable(this.cerrable);

		dialogo.addWindowPaneListener(eventoCierreVentana);
		padre.add(dialogo);
		distribuirEventoMostrar();
		
	}
	
	public void mostrarDialogo() {
		// TODO Auto-generated method stub
		this.padre = Aplicacion.getApp().getDefaultWindow().getContent();		
		dialogo = new VentanaDialogo(this, ancho, alto);		
		dialogo.setMinimizable(this.minimizable);
		dialogo.setMaximizable(this.maximizable);
		dialogo.setClosable(this.cerrable);
		dialogo.setModal(this.modal);
		dialogo.addWindowPaneListener(eventoCierreVentana);
		padre.add(dialogo);
		distribuirEventoMostrar();
	}


	public int getAlto() {
		return alto;
	}

	public void setAlto(int alto) {
		this.alto = alto;
	}

	public int getAncho() {
		return ancho;
	}

	public void setAncho(int ancho) {
		this.ancho = ancho;
	}

	public ImageReference getIcono()
	{
		return icono;
	}
	
	public void mostrarDialogo(Component padre, int ancho, int alto) {
		// TODO Auto-generated method stub
		this.padre = padre;
		dialogo = new VentanaDialogo(this, ancho, alto);
		dialogo.setModal(this.modal);
		dialogo.setMinimizable(this.minimizable);
		dialogo.setMaximizable(this.maximizable);
		if (ancho == 0)
		{
			dialogo.setHeight(new Extent(460,Extent.PX));
			dialogo.setWidth(new Extent(968,Extent.PX));
		}
		//dialogo.setMaximized(true);		
		//dialogo.setPositionY(new Extent(10,Extent.PX));
		//dialogo.setPositionX(new Extent(10,Extent.PX));
		dialogo.setClosable(this.cerrable);
		dialogo.addWindowPaneListener(eventoCierreVentana);
		
		padre.add(dialogo);		
		distribuirEventoMostrar();
	}
	

	public Vector<VentanaListener> getListeners() {
		return listeners;
	}

	public void setListeners(Vector<VentanaListener> listeners) {
		this.listeners = listeners;
	}

	public void setIcono(ImageReference icono) {
		this.icono = icono;
	}

	public boolean isIncrustado() {
		return incrustado;
	}

	public void setIncrustado(boolean incrustado) {
		this.incrustado = incrustado;
	}

	public boolean isModal() {
		return modal;
	}

	public void setModal(boolean modal) {
		this.modal = modal;
	}

	public boolean isCerrable() {
		return cerrable;
	}

	public void setCerrable(boolean cerrable) {
		this.cerrable = cerrable;
	}

	public boolean isMaximizable() {
		return maximizable;
	}

	public void setMaximizable(boolean maximizable) {
		this.maximizable = maximizable;
	}

	public boolean isMinimizable() {
		return minimizable;
	}

	public void setMinimizable(boolean minimizable) {
		this.minimizable = minimizable;
	}

}

class VentanaDialogo extends SpWindowPane {

	public VentanaDialogo(Ventana ventana, int ancho, int alto) {
		super();
		this.setTitle(ventana.getTitulo());
		this.setHeight(new Extent(alto, Extent.PX));
		this.setWidth(new Extent(ancho, Extent.PX));
		this.setTitleHeight(new Extent(25, Extent.PX));
		this.setIconInsets(new Insets(new Extent(0, Extent.PX)));
		this.setMovable(true);
		this.setTitleInsets(new Insets(new Extent(0, Extent.PX)));
		//this.setModal(true);
		this.setStyleName("Obelisco.Ventana");
		//this.setStyleName("TransGreen");
		
		this.setDefaultCloseOperation(SpWindowPane.DO_NOTHING_ON_CLOSE);
		
		this.setClosable(true);
		this.setResizable(true);
		this.setTitleFont(new Font(Font.VERDANA, Font.BOLD, new Extent(12)));

		this.setIcon(ventana.getIcono());

		ContentPaneEx contenido = new ContentPaneEx();

		DisplayLayoutData layoutData = new DisplayLayoutData();
		layoutData.setHeight(new ExtentEx("100%"));
		layoutData.setWidth(new ExtentEx("100%"));
		contenido.setLayoutData(layoutData);
		
		contenido.add(ventana);

		add(contenido);

	}

}